package cn.iocoder.yudao.module.wgxm.service.lx;

import cn.hutool.core.date.LocalDateTimeUtil;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;
import cn.iocoder.yudao.module.wgxm.controller.admin.lx.vo.*;
import cn.iocoder.yudao.module.wgxm.dal.dataobject.lx.LxDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;

import cn.iocoder.yudao.module.wgxm.dal.mysql.lx.LxMapper;

import javax.annotation.Resource;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.wgxm.enums.ErrorCodeConstants.*;

/**
 * 项目立项 Service 实现类
 *
 * @author 芋道源码
 */
@Service
@Validated
public class LxServiceImpl implements LxService {

    public static final String PROCESS_KEY = "wgxm_lx";
    @Resource
    private LxMapper lxMapper;

    @Resource
    private BpmProcessInstanceApi processInstanceApi;

    @Override
    public Long createLx(LxSaveReqVO createReqVO) {
        // 插入
        LxDO lx = BeanUtils.toBean(createReqVO, LxDO.class);
        lxMapper.insert(lx);
        // 返回
        return lx.getId();
    }

    @Override
    public void updateLx(LxSaveReqVO updateReqVO) {
        // 校验存在
        validateLxExists(updateReqVO.getId());
        // 更新
        LxDO updateObj = BeanUtils.toBean(updateReqVO, LxDO.class);
        lxMapper.updateById(updateObj);
    }

    @Override
    public void deleteLx(Long id) {
        // 校验存在
        validateLxExists(id);
        // 删除
        lxMapper.deleteById(id);
    }

    private void validateLxExists(Long id) {
        if (lxMapper.selectById(id) == null) {
            throw exception(LX_NOT_EXISTS);
        }
    }

    @Override
    public LxDO getLx(Long id) {
        return lxMapper.selectById(id);
    }

    @Override
    public PageResult<LxDO> getLxPage(LxPageReqVO pageReqVO) {
        return lxMapper.selectPage(pageReqVO);
    }


    //发起一个立项流程
    @Override
    public Long createLxProc(Long loginUserId, LxSaveReqVO createReqVO) {
        // 插入 OA 请假单
        //long day = LocalDateTimeUtil.between(createReqVO.getStartTime(), createReqVO.getEndTime()).toDays();
//        LxDO lx = BeanUtils.toBean(createReqVO, LxDO.class)
//                   .setStatus(BpmTaskStatusEnum.RUNNING.getStatus());
//        lxMapper.insert(lx);
//
//        // 发起 BPM 流程
//        Map<String, Object> processInstanceVariables = new HashMap<>();
//        //processInstanceVariables.put("day", day);
//        String processInstanceId = processInstanceApi.createProcessInstance(loginUserId,
//                new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(PROCESS_KEY)
//                        .setVariables(processInstanceVariables).setBusinessKey(String.valueOf(lx.getId()))
//                        .setStartUserSelectAssignees(null);
//
//        // 将工作流的编号，更新到 OA 请假单中
//        lxMapper.updateById(new LxDO().setId(lx.getId()).setProcessInstanceId(processInstanceId));
//        return lx.getId();

        return null;
    }

}